/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package paw.eltabique.web.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import paw.eltabique.domain.Mensaje;
import paw.eltabique.domain.Perfil;
import paw.eltabique.domain.Permisos;
import paw.eltabique.domain.Usuario;
import paw.eltabique.service.interfaces.MensajeFacadeLocal;
import paw.eltabique.service.interfaces.PerfilFacadeLocal;
import paw.eltabique.service.interfaces.UsuarioFacadeLocal;
import paw.eltabique.web.UserData;
import paw.eltabique.web.resources.ApplicationResources;

/**
 *
 * @author drakart
 */
public class FrontController extends HttpServlet {
  @EJB
  private UsuarioFacadeLocal usuarioFacade;
  @EJB
  private MensajeFacadeLocal mensajeFacade;
  @EJB
  private PerfilFacadeLocal perfilFacade;

  private void dispatch (HttpServletRequest req, HttpServletResponse res, String page) throws ServletException, IOException{
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
      dispatcher.forward(req, res);
  }

  private void crearUsuario(HttpServletRequest req, HttpServletResponse res) throws IOException{
      PrintWriter pw = res.getWriter();
      try{
     String nombre = req.getParameter(ApplicationResources.CREAR_NOMBRE);
     if(nombre !=null && !nombre.isEmpty()){
       Usuario nuevoUsuario = new Usuario();
       nuevoUsuario.setUserName(nombre);
       try{
         nuevoUsuario.setPerfil(perfilFacade.gerPerfilByNombre(ApplicationResources.ROLE_USER));
         usuarioFacade.create(nuevoUsuario);
         req.setAttribute(ApplicationResources.MSJ_RESULT, "Usuario creado con éxito");
         
           pw.println("Usuario creado con &eacute;xito");
       }catch (Exception e){
          pw.println("Error: No es posible crear usuario.");
       }
     } else {
       pw.println("Error: Nombre null.");
     }
   }finally{
     pw.close();
   }
  }
  private void borrarUsuario(HttpServletRequest req, HttpServletResponse res) throws IOException{
    PrintWriter pw = res.getWriter();
    try{
    String nombre = req.getParameter(ApplicationResources.BORRAR_NOMBRE);
    if(nombre !=null){
      Usuario usr = usuarioFacade.find(nombre);
      if(usr != null){
       usuarioFacade.remove(usr);
        pw.println("Usuario borrado con &eacute;xito");
      } else {
        pw.println("Error: Usuario "+nombre+" no existe.");
      }
    } else {
      pw.println("Error: Nombre null.");
    }

         
      }finally{
         pw.close();
      }
  }
  private void cambiarPerfil(HttpServletRequest req, HttpServletResponse res) throws IOException{
    PrintWriter pw = res.getWriter();
    try{
    String nuevoPerfilKey = req.getParameter(ApplicationResources.CAMBIAR_PERFIL);
    String nomUsuario = req.getParameter(ApplicationResources.USER_NAME_ACT);
    if(nuevoPerfilKey !=null && nomUsuario != null){
      Perfil nuevoPerfil = perfilFacade.gerPerfilByNombre(nuevoPerfilKey);
      Usuario usr = usuarioFacade.find(nomUsuario);
      if (usr != null){
        usr.setPerfil(nuevoPerfil);
        usuarioFacade.edit(usr);
        pw.println("Perfil cambiado con &eacute;xito");
      } else {
        pw.println("Error: Usuario "+nomUsuario+" no existe.");
      }
    } else {
      pw.println("Error: Nombre null o nuevo perfil null.");
    }

    }finally{
      pw.close();
    }
  }
  
  private void crearMensaje(HttpServletRequest req, HttpServletResponse res) throws IOException{
     PrintWriter pw = res.getWriter();
     try{
     UserData ud = (UserData) req.getSession().getAttribute(ApplicationResources.USER_DATA_KEY);
     if(ud != null){
       String userName = ud.getUserName();
       Mensaje m = new Mensaje();
       m.setUserName(userName);
       m.setTexto(req.getParameter(ApplicationResources.MSJ_TXT));
       m.setFecha(new Date());
       mensajeFacade.create(m);
       pw.println("Nuevo mensaje publicado!");
     }else{
       pw.println("Error: Tiene que estar connectado para enviar un mensaje.");
     }
    }finally{
     pw.close();
    }
  }
  private void listarMensajes(HttpServletRequest req, HttpServletResponse res) throws IOException{
      List<Mensaje> mensajes = mensajeFacade.findAll();
      res.setContentType("text/html;charset=UTF-8");
      PrintWriter pw = res.getWriter();
          try{
              
          for(Mensaje m: mensajes){
             pw.println("<div class='mensaje'>");
             pw.println("<div class='mensaje-entete'>");
             pw.print("De: "+m.getUserName());
             if(m.getFecha()!=null){
               pw.println(" ["+m.getFecha().toString()+"]");
             } else {
               pw.println(" [no fecha]");
             }
             pw.println("</div>");
             pw.println(m.getTexto());
             pw.println("</div>");
          }
          }finally{
          pw.close();
      }
  }
  private void listarUsuarios(HttpServletRequest req, HttpServletResponse res) throws IOException{
    List<Usuario> usuarios = usuarioFacade.findAll();
    res.setContentType("text/html;charset=UTF-8");
      PrintWriter pw = res.getWriter();
      try{
//?accion=cambiar-perfil loadXML('?accion=cambiar-perfil&crear_nombre='+document.getElementById('crear-nombre-input').value,crearUsuario)
          for(Usuario u: usuarios){
            String javascript_guest = "loadXML('?accion=cambiar-permisos&nom_usuario="+u.getUserName()+"&perfil="+ApplicationResources.ROLE_GUEST+"',cambiarPerfil)";
            String javascript_user = "loadXML('?accion=cambiar-permisos&nom_usuario="+u.getUserName()+"&perfil="+ApplicationResources.ROLE_USER+"',cambiarPerfil)";
            String javascript_admin = "loadXML('?accion=cambiar-permisos&nom_usuario="+u.getUserName()+"&perfil="+ApplicationResources.ROLE_ADMIN+"',cambiarPerfil)";
             pw.println("<div class='usuario'>");
             pw.println("<div id="+u.getUserName()+" class='window-move'>");
             pw.println("Nombre: "+u.getUserName()+".<br/>Permisos: "+ u.getPerfil().getNombre()+"</div>");
             pw.println("<div><input type=\"hidden\" name=\""+ApplicationResources.USER_NAME_ACT+"\" value='"+u.getUserName()+"'/>");
             pw.println("<input type=\"submit\" onclick=\""+javascript_guest+"\" name=\""+ApplicationResources.CAMBIAR_PERFIL+"\" value=\""+ApplicationResources.ROLE_GUEST+"\"/>");
             pw.println("<input type=\"submit\" onclick=\""+javascript_user+"\" name=\""+ApplicationResources.CAMBIAR_PERFIL+"\" value=\""+ApplicationResources.ROLE_USER+"\"/>");
             pw.println("<input type=\"submit\" onclick=\""+javascript_admin+"\" name=\""+ApplicationResources.CAMBIAR_PERFIL+"\" value=\""+ApplicationResources.ROLE_ADMIN+"\"/>");
             pw.println("</div><hr></div>");
          }
          }finally{
          pw.close();
      }
  }

  private String viewResolver(HttpServletRequest req){
    UserData userData = (UserData) req.getSession().getAttribute(ApplicationResources.USER_DATA_KEY);

    String userPage = "/WEB-INF/views/login.jsp";

    if(userData != null){
      String role = userData.getRole();
      if(role.equals(ApplicationResources.ROLE_ADMIN)){
        userPage = "/WEB-INF/views/index-admin.jsp";
      }else if(role.equals(ApplicationResources.ROLE_USER)){
        userPage = "/WEB-INF/views/index-user.jsp";
      }else if (role.equals(ApplicationResources.ROLE_GUEST)){
        userPage = "/WEB-INF/views/index-guest.jsp";
      }
    }
    return userPage;
  }

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
      
      String resultPage = "";
      String accion = request.getParameter("accion");
      
      HttpSession session = request.getSession();
      UserData ud = (UserData) session.getAttribute(ApplicationResources.USER_DATA_KEY);
      if(accion !=null && accion.equals("logout")){
        session.invalidate();
      }
      //si la accion es login y no hay datos del usuario
      if (accion != null && accion.equals("login") && ud == null) {
        //validar usuario
        String userName = request.getParameter(ApplicationResources.USER_NAME_KEY);
        String role = request.getParameter(ApplicationResources.USER_ROLE_KEY);
        boolean isValido = usuarioFacade.validar(userName, role);
        if (isValido) {
          UserData userData = new UserData();
          userData.setUserName(userName);
          userData.setRole(role);
          request.getSession().setAttribute(ApplicationResources.USER_DATA_KEY, userData);
        } else {
          request.setAttribute(ApplicationResources.LOGIN_ERROR, "Datos no válidos");
        }
      }else if(accion !=null && ud != null){
        Perfil p = perfilFacade.gerPerfilByNombre(ud.getRole());
        for (Permisos per:p.getPermisos()){
          if(per.getNombre().equals(accion)){
            //do acction
            if(accion.equals("crear-usuario")){
              crearUsuario(request, response);
              return;
            }else if(accion.equals("listar-mensajes")){
              listarMensajes(request, response);
              return;
            }else if(accion.equals("listar-usuarios")) {
              listarUsuarios(request, response);
              return;
            }else if(accion.equals("crear-mensaje")){
              crearMensaje(request, response);
              return;
            }else if(accion.equals("cambiar-permisos")){
              cambiarPerfil(request, response);
              return;
            }else if (accion.equals("borrar-usuario")) {
              borrarUsuario(request, response);
              return;
            }

            break;
          }
        }
        

      }
      resultPage = viewResolver(request);
      dispatch(request, response, resultPage);
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
